package mymyoux.utils
{
	/**
	 * Permet de facilement chronométré une portion de code ou une fonction.
	 *
	 */ 
	public class Timer
	{
		static protected var timers:Hash;
		protected var _time:Number
		public function Timer()
		{
			if(timers==null)
			{
				timers=new Hash();
			}
			_time=new Date().getTime();
		}
		static public function start(objet:*):void
		{
			if(timers==null)
			{
				timers=new Hash();
			}
			timers.put(objet,new Timer());
		}
		static public function stop(objet:*,showTrace:Boolean=false):Number
		{
			if(timers==null)
			{
				timers=new Hash();
			}
			var timer:Timer=timers.get(objet) as Timer;
			if(timer!=null)
			{
				var time:Number=timer.elapsedTime;
				if(showTrace)
				{
					trace(objet.toString()+" a mis : "+time+" ms");
				}
				
				timers.remove(objet);
				return time;
			}
			return 0;
		}
		static public function testFunction(fonction:Function,thisObject:Object,times:uint=100,args:Array=null):Array
		{
			var id:uint=Maths.unique;
			var results:Array=new Array();
			var i:int;
			var somme:Number=0;
			for(i=0;i<times;i++)
			{
				Timer.start(id);
				fonction.apply(thisObject,args);
				results.push(Timer.stop(id));
				somme+=results[results.length-1];
			}
			trace(times+" fois en "+somme+" ms / moyenne = "+somme/times+" ms");
			return results;		
		}
		public function get elapsedTime():Number
		{
			return new Date().getTime()-_time;
		}

	}
}